'use strict';
/**
 * @controller adminManagerController 新增管理员-后台管理
 */
const Controller = require('egg').Controller;

class ManagerController extends Controller {

    /**  
     * @summary 获取管理员列表
     * @description 获取管理员列表
     * @router get /admin/manager/index 
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async index() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 查询
        let data = await ctx.page('Manager')
        // 渲染并返回数据
        await ctx.renderTemplate({
            data: data,
            title: '管理员列表',
            tempType: 'table',
            table: {
                buttons: {
                    add: '/admin/manager/create'
                },
                columns: [{
                        title: 'ID',
                        key: 'id',
                        fixed: 'left'
                    },
                    {
                        title: '管理员',
                        key: 'username',
                        fixed: 'left'
                    },
                    {
                        title: '创建时间',
                        key: 'created_time',
                        fixed: 'center',
                        width: 200
                    },
                    {
                        title: "操作",
                        width: 200,
                        fixed: 'center',
                        action: {
                            edit: function (id) {
                                return `/admin/manager/edit/${id}`
                            },
                            delete: function (id) {
                                return `/admin/manager/delete/${id}`
                            },
                        }
                    }
                ]
            }
        })
    }

    // 新增页面
    /**  
     * @summary 渲染创建管理员
     * @description 渲染创建管理员
     * @router get /admin/manager/create 
     * @request get 这里不需要参数
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async create() {
        const {
            ctx,
            app
        } = this;
        // 渲染公共模板
        await ctx.renderTemplate({
            // 页面标题
            title: "创建管理员",
            // 模板类型 form表单，table表格分页
            tempType: "form",
            // 表单配置
            form: {
                // 提交地址
                action: "/admin/manager/save",
                // 字段配置
                fields: [{
                    label: "用户名",
                    type: "text",
                    name: "username",
                    placeholder: "用户名",
                }, {
                    label: "密码",
                    type: "text",
                    name: "password",
                    placeholder: "密码"
                }]
            },
            // 新增成功跳转路径
            successUrl: "/admin/manager"
        })
    }
    /**  
     * @summary 创建管理员
     * @description 创建管理员
     * @router post /admin/manager/save 
     * * @request username string *username xxxx
     * * @request password string *password xxxx
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    // 新增逻辑
    async save() {
        // 结构
        let {
            app,
            ctx
        } = this;

        // 参数验证
        ctx.validate({
            username: {
                type: 'string',
                required: true,
                desc: '管理员账户'
            },
            password: {
                type: 'string',
                required: true,
                desc: '管理员密码'
            }
        })
        // 获取参数
        let {
            username,
            password
        } = ctx.request.body
        /* 判断用户是否存在 */
        if (await app.model.Manager.findOne({
                where: {
                    username: username
                }
            })) {
            return ctx.apiFail('管理员已存在')
        }
        /* 创建用户 */
        let manager = await app.model.Manager.create({
            username,
            password
        })
        // ctx.apiSuccess(manager)
        ctx.toast('添加成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/manager')
    }
    /**  
     * @summary 根据ID删除管理员
     * @description 根据ID删除管理员
     * * @request id string *id xxx/id
     * @router get /admin/manager/delete/:id 
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async delete() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 获得参数
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '管理员ID'
            }
        })
        // 删除数据
        let id = ctx.params.id
        // 添加cookie
        await app.model.Manager.destroy({
            where: {
                id
            }
        })
        ctx.toast('删除成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/manager')
    }

    /**  
     * @summary 修改管理员功能
     * @description 修改管理员功能
     * @router get /admin/manager/edit/:id 
     * * @request id string *id xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async edit() {
        // 结构
        let {
            app,
            ctx
        } = this
        // 参数验证
        ctx.validate({
            id: {
                type: 'string',
                required: true,
                desc: '管理员ID'
            }
        })
        // 获取参数
        let id = ctx.params.id
        // 判断管理员是否存在
        let data = await app.model.Manager.findOne({
            where: {
                id
            }
        })
        // 不存在-渲染404页面
        if (!data) {
            return await ctx.pageFail('该记录不存在')
        }
        // 存在-渲染表单页面
        data = JSON.parse(JSON.stringify(data))
        delete data.password
        await ctx.renderTemplate({
            id,
            title: '修改管理员',
            tempType: 'form',
            form: {
                action: '/admin/manager/update/'+id,
                // 字段配置
                fields: [{
                    label: "用户名",
                    type: "text",
                    name: "username",
                    placeholder: "用户名",
                }, {
                    label: "密码",
                    type: "text",
                    name: "password",
                    placeholder: "密码"
                }],
                data
            },
            // 新增成功跳转路径
            successUrl:"/admin/manager"
        })
    }

    /**  
     * @summary 更新管理员信息
     * @description 更新管理员信息
     * @router post /admin/manager/update/:id 
     * * @request id string *id xxx
     * * @request username string *username xxx
     * * @request password string *password xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async update(){
        // 结构
        let {app,ctx}=this
        // 参数验证
        ctx.validate({
            id:{
                type:'int',
                required:true,
                desc:'管理员ID'
            },
            username:{
                type:'string',
                required:true,
                desc:'管理员用户名'
            },
            password:{
                type:'string',
                required:false,
                desc:'密码'
            }
        })
        // 获取参数
        let id=ctx.params.id
        let {username,password}=ctx.request.body
        // 查询用户是否存在
        let manager=await app.model.Manager.findOne({
            where:{
                id
            }
        })
        if(!manager){
            return ctx.apiFail('管理员不存在')
        }
        // 查询用户名是否唯一 用到[Op.ne] 不等于
        let Op=app.Sequelize.Op
        if(await app.model.Manager.findOne({
            where:{
                username,
                id:{
                    [Op.ne]:id
                }
            }
        })){
            return ctx.apiFail('用户名已存在')
        }
        // 如果密码存在--赋值密码
        manager.username=username
        if(password){
            manager.password=password
        }
        // 返回成功的提示
        ctx.apiSuccess(await manager.save())
    }

}

module.exports = ManagerController;